package com.xsmart.order.dao;

import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

@Component
public interface CartDao {
    /**
     * 查询购物车列表
     * @param uid
     * @return 购物车列表
     */
    @Select("select c.rec_id,c.goods_id,c.goods_number,g.goods_name,g.market_price, g.goods_number as stock," +
            "g.shop_price,g.promote_price,g.goods_img,g.goods_brief," +
            "(case when g.is_promote=1 and g.promote_start_date <= NOW() and g.promote_end_date >= NOW() then g.promote_price ELSE g.shop_price END)  goods_price " +
            "from cart c " +
            "left outer join  goods g " +
            "on g.goods_id=c.goods_id " +
            "where c.user_id = #{uid}")
    List<Map<String,Object>> queryCartList(@Param("uid") Integer uid);


    /**
     * 查询购物车商品数量
     *
     * @param uid 用户id
     * @param pid 商品id
     * @return 购物车id，商品数量
     */
    @Select("select rec_id,goods_number from cart where user_id=#{uid} and goods_id=#{pid}")
    Map<String, Object> queryCartByGoodsId(@Param("uid") Integer uid, @Param("pid") Integer pid);

    /**
     * 查询购物车商品数量
     *
     * @param recId 购物车id
     * @return 购物车
     */
    @Select("select * from cart where rec_id=#{recId}")
    Map<String, Object> queryCartByRecId(@Param("recId") Integer recId);

    /**
     * 删除购物车
     * @param recId 购物车id
     * @return 影响记录数
     */
    @Delete("delete from cart where rec_id=#{recId}")
    int delCart(@Param("recId") Integer recId);

    /**
     * 更新购物车商品数量
     *
     * @param uid      用户id
     * @param pid      商品id
     * @param goodsNum 商品数量
     * @return 更新记录数
     */
    @Update("update cart set goods_number=#{goodsNum} where user_id=#{uid} and goods_id=#{pid}")
    int updateCartGoodsNumberByGoodsId(@Param("uid") Integer uid, @Param("pid") Integer pid, @Param("goodsNum") Integer goodsNum);

    /**
     * 更新购物车商品数量
     *
     * @param recId    购物车id
     * @param goodsNum 商品数量
     * @return 更新记录数
     */
    @Update("update cart set goods_number=#{goodsNum} where rec_id=#{recId}")
    int updateCartGoodsNumber(@Param("recId") Integer recId, @Param("goodsNum") Integer goodsNum);

    /**
     * 添加购物车
     *
     * @param cartInfoMap 商品信息
     *                    user_id	用户ID
     *                    token	用户登录TOKEN
     *                    goods_id	商品ID
     *                    goods_sn	商品货号
     *                    goods_name	商品名称
     *                    market_price	商品市场价
     *                    goods_price	商品销售价格
     *                    goods_number	商品数量
     *                    is_real	是否是实物，1是，0否
     *                    parent_goods_id	父商品ID，-1为无父商品ID，其他为本商品为父商品的配件
     *                    rec_type	购物车类型，0普通；1团购；2拍卖；
     *                    is_gift	是否赠品，0否，其他为优惠活动的ID
     *                    goods_attr	商品属性
     *                    goods_attr_id	商品属性ID
     *                    id	商店iduser_id	用户ID
     *                    token	用户登录TOKEN
     *                    goods_id	商品ID
     *                    goods_sn	商品货号
     *                    goods_name	商品名称
     *                    market_price	商品市场价
     *                    goods_price	商品销售价格
     *                    goods_number	商品数量
     *                    is_real	是否是实物，1是，0否
     *                    parent_goods_id	父商品ID，-1为无父商品ID，其他为本商品为父商品的配件
     *                    rec_type	购物车类型，0普通；1团购；2拍卖；
     *                    is_gift	是否赠品，0否，其他为优惠活动的ID
     *                    goods_attr	商品属性
     *                    goods_attr_id	商品属性ID
     *                    id	商店id
     * @return 添加记录数
     */
    @Insert("insert into cart(user_id,token,goods_id,goods_sn,goods_name,market_price,goods_price,goods_number,is_real,parent_goods_id,rec_type,is_gift,goods_attr,goods_attr_id,id)" +
            "values(#{user_id},#{token},#{goods_id},#{goods_sn},#{goods_name},#{market_price},#{goods_price},#{goods_number},#{is_real},#{parent_goods_id},#{rec_type},#{is_gift},#{goods_attr},#{goods_attr_id},#{id})")
    @Options(useGeneratedKeys = true, keyProperty = "rec_id", keyColumn = "rec_id")
    int addCart(Map<String, Object> cartInfoMap);
}
